﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Contract.Business.Entity;
using Contract.Business.Filter;
using Generic.Business.Process;
using Contract.Business.Manager;
using Contract.Business.Validation;

namespace Contract.Business.Process
{
    //Criado por : Gustavo
    //Data       : 10/25/2011 12:04:42 AM
    public class BPCliente : BPGeneric<BECliente, BMCliente, BVCliente, FECliente>
    {
        #region Singleton
        private BMVenda businessManagerVenda;
        private BMVenda bmVenda
        {
            get
            {
                if (businessManagerVenda == null)
                    businessManagerVenda = new BMVenda();

                return businessManagerVenda;
            }
        }

        private BMEnderecoCliente businessEnderecoCliente;
        private BMEnderecoCliente bmEnderecoCliente
        {
            get
            {
                if (businessEnderecoCliente == null)
                    businessEnderecoCliente = new BMEnderecoCliente();

                return businessEnderecoCliente;
            }
        }

        #endregion

        public List<BECliente> BuscarClienteVenda(string telefone)
        {
            return this.BusinessManager.BuscarClienteVenda(telefone);
        }

        public override void Excluir(BECliente entidade)
        {
            try
            {
                string validacao = verificarDependencias(entidade);

                if (String.IsNullOrEmpty(validacao))
                    base.Excluir(entidade);
                else
                    throw new Exception(validacao);
            }
            catch (Exception)
            {
                throw;
            }
        }

        private string verificarDependencias(BECliente entidade)
        {
            try
            {
                if (bmVenda.ObterTodos(new FEVenda() { CodigoCliente = entidade.Codigo }).Count > 0)
                    return "Não é possível excluir este cliente pois ele possui vendas realizadas.";
                else
                    return String.Empty;
            }
            catch (Exception)
            {
                throw;
            }
        }

        public BEEnderecoCliente adicionarEndereco(BECliente entidade)
        {
            BEEnderecoCliente retorno = bmEnderecoCliente.BuscarEnderecoExistente(new FEEnderecoCliente() { CodigoCliente = entidade.Codigo, Endereco = entidade.Endereco });
            if (retorno == null)
            {
                BEEnderecoCliente enderecoCliente = new BEEnderecoCliente()
                                                                    {
                                                                        CodigoCliente = entidade.Codigo,
                                                                        Endereco = entidade.Endereco,
                                                                        Principal = true
                                                                    };
                retorno = bmEnderecoCliente.Salvar(enderecoCliente);
            }
            else
            {
                if (!retorno.Principal)
                {
                    retorno.Principal = true;
                    bmEnderecoCliente.Salvar(retorno);
                }
            }

            List<BEEnderecoCliente> enderecos = bmEnderecoCliente.ObterTodos(new FEEnderecoCliente() { CodigoCliente = entidade.Codigo }).Where(q => q.Codigo != retorno.Codigo && q.Principal).ToList();
            if (enderecos.Count > 0)
            {
                enderecos.ForEach(q => q.Principal = false);
                bmEnderecoCliente.Salvar(enderecos);
            }

            return retorno;
        }

        public override BECliente Salvar(BECliente entidade)
        {
            base.Salvar(entidade);

            List<BEEnderecoCliente> enderecos = bmEnderecoCliente.ObterTodos(new FEEnderecoCliente() { CodigoCliente = entidade.Codigo });
            BEEnderecoCliente enderecoCliente = new BEEnderecoCliente()
            {
                CodigoCliente = entidade.Codigo,
                Endereco = entidade.Endereco,
                Principal = (enderecos == null || !enderecos.Any(q => q.Principal))
            };
            bmEnderecoCliente.Salvar(enderecoCliente);

            return entidade;
        }
    }
}
